using oms.Shared.Services.Redis;

namespace oms.Shared.Data;

/// <summary>
/// 主键生成器
/// 以yyyyMMdd格式为前缀，加上 redis 每天生成的序列号 拼成16位的字符串
/// </summary>
public class IdGenerator(IRedisService redisService)
{
    /// <summary>
    /// 生成主键
    /// </summary>
    /// <returns>16位字符串的主键</returns>
    public async Task<string> GenerateIdAsync()
    {
        // 生成 yyyyMMdd 格式的日期字符串
        var datePart = DateTime.Now.ToString("yyyyMMdd");

        // 从 Redis 获取下一个序列号（每日过期）
        var sequence = await redisService.GetNextSequenceWithDailyExpiryAsync($"db:primary:{datePart}");

        // 格式化序列号为 8 位字符串（不足补零）
        var sequencePart = sequence.ToString("D8");

        // 拼接日期部分和序列号部分
        return $"{datePart}{sequencePart}";
    }
}